#!/usr/bin/env node

/**
 * Next.js 服务器入口文件
 * 用于 pkg 打包的应用启动文件
 */

const { createServer } = require('http');
const { parse } = require('url');
const next = require('next');
const path = require('path');

// 检测是否在打包的可执行文件中运行
const dev = false; // 生产模式
const hostname = process.env.HOSTNAME || 'localhost';
const port = process.env.PORT || 3000;

// 配置 Next.js 应用
const app = next({
  dev,
  hostname,
  port,
  // 在打包环境中设置正确的目录
  dir: __dirname,
  conf: {
    // 确保在打包环境中正确加载配置
    distDir: '.next'
  }
});

const handle = app.getRequestHandler();

/**
 * 启动服务器
 */
async function startServer() {
  try {
    console.log('正在准备 Next.js 应用...');
    await app.prepare();

    const server = createServer(async (req, res) => {
      try {
        const parsedUrl = parse(req.url, true);
        await handle(req, res, parsedUrl);
      } catch (err) {
        console.error('处理请求时出错:', err);
        res.statusCode = 500;
        res.end('Internal Server Error');
      }
    });

    server.listen(port, hostname, () => {
      console.log(`> 服务器已启动: http://${hostname}:${port}`);
      console.log('> 按 Ctrl+C 停止服务器');

      // 检查授权状态并自动启动 SD WebUI
      setTimeout(async () => {
        try {
          // 首先检查授权状态
          console.log('> 正在检查授权状态...');
          const licenseResponse = await fetch(`http://${hostname}:${port}/api/license/status`, {
            method: 'GET',
            headers: {
              'Content-Type': 'application/json'
            }
          });

          const licenseResult = await licenseResponse.json();
          console.log('> 授权状态检查结果:', licenseResult);

          // 检查授权是否已过期
          if (licenseResult.status !== 200) {
            console.log('> 授权已过期，正在执行自动登出...');

            // 调用登出接口
            try {
              const logoutResponse = await fetch(`http://${hostname}:${port}/api/auth/logout`, {
                method: 'POST',
                credentials: 'include',
              });
            } catch (logoutError) {
              console.log('> 自动登出请求失败:', logoutError.message);
            }

            // 授权过期时不启动 SD WebUI，但打开浏览器
            console.log('> 由于授权已过期，跳过 SD WebUI 启动');
            console.log('> 正在自动打开浏览器...');

            // 自动打开浏览器
            try {
              const { exec } = require('child_process');
              const url = `http://${hostname}:${port}`;

              // 根据操作系统选择不同的命令
              let command;
              switch (process.platform) {
                case 'darwin': // macOS
                  command = `open ${url}`;
                  break;
                case 'win32': // Windows
                  command = `start ${url}`;
                  break;
                default: // Linux 等
                  command = `xdg-open ${url}`;
                  break;
              }

              exec(command, (error) => {
                if (error) {
                  console.log('> 自动打开浏览器失败:', error.message);
                  console.log('> 请手动访问:', url);
                } else {
                  console.log('> 浏览器已打开，访问地址:', url);
                }
              });
            } catch (browserError) {
              console.log('> 打开浏览器时出错:', browserError.message);
              console.log('> 请手动访问: http://' + hostname + ':' + port);
            }
            return;
          } else {
            console.log('> 授权状态有效，继续启动 SD WebUI');
          }
        } catch (licenseError) {
          console.log('> 授权状态检查出错:', licenseError.message, '继续启动 SD WebUI');
        }

        // 启动 SD WebUI
        try {
          console.log('> 正在自动启动 SD WebUI...');
          const response = await fetch(`http://${hostname}:${port}/api/sd/start`, {
            method: 'POST',
            headers: {
              'Content-Type': 'application/json'
            }
          });

          if (response.ok) {
            const result = await response.json();
            console.log('> SD WebUI 启动请求已发送:', result.message || '成功');
          } else {
            console.log('> SD WebUI 启动请求失败:', response.status);
          }
        } catch (error) {
          console.log('> SD WebUI 自动启动失败:', error.message);
        }
      }, 2000); // 延迟2秒确保服务器完全启动
    });

    // 优雅关闭处理
    process.on('SIGTERM', () => {
      console.log('收到 SIGTERM 信号，正在关闭服务器...');
      server.close(() => {
        console.log('服务器已关闭');
        process.exit(0);
      });
    });

    process.on('SIGINT', () => {
      console.log('收到 SIGINT 信号，正在关闭服务器...');
      server.close(() => {
        console.log('服务器已关闭');
        process.exit(0);
      });
    });

  } catch (err) {
    console.error('启动服务器时出错:', err);
    process.exit(1);
  }
}

// 启动应用
startServer();